# author: LiuShihao
# data: 2020/11/25 11:07 下午
# youknow: 各位老铁,我的这套代码曾经有人出价三个亿我没有卖,如今拿出来和大家分享,不求别的,只求大家免费的小红心帮忙点一点,这里谢过了。
# desc: 集合 类型的学习  可变序列
"""
集合是一种没有value的字典，与列表、字典都是可变类型序列
集合的创建方式：
    1.直接使用{}                    s = {'Python',98,'hello'}
    2.使用内置函数set（）             s = set(range(5))
字典的创建方式：
    1.直接使用{key:value,key2:value2}            source = {'张三':98,'李四':100,'王五':66}
    2.使用内置函数dict{key=value,key2=value2}     user = dict(name='张三',age=18)
"""
s1 = {'Python',98,'hello'}
s2 = set(range(5))       # {0, 1, 2, 3, 4}
print(s1,type(s1))
print(s2,type(s2))
print(set([3,23,245,56]))      # 列表     # {56, 3, 245, 23}
print(set((13,34,5463,12)))    # 元组     # {34, 12, 13, 5463}
print(set('python'))           # 字符串   # {'n', 'p', 't', 'h', 'y', 'o'}
print(set({12,42,12,453}))     # 集合     # {42, 12, 453}   去重
print(set())                             # set()
# 定义一个空集合
s = {}  # 这样写类型是字典   {} <class 'dict'>
print(s,type(s))
s = set()   # set() <class 'set'>
print(s,type(s))
# 集合元素的判断操作   in 、not in
s = {'Python','hello',98,24,31}
print(98 in s)
print('hello' not in s )

"""
集合元素的新增操作
    1. 调用add（）方法，一次添加一个元素
    2. 调用update（）方法至少添加一个元素
"""
s = {'Python','hello',98,24,31}
print(s)
s.add('world')
print(s)
s.update({11,22,33,44}) #update内是一个集合 不能写成s.update(111,222,333)的形式  # TypeError: 'int' object is not iterable
s.update([111,222,333,444])
s.update((1111,2222,3333,4444))
print(s)
print('--------------------------------------------')
"""
集合元素的删除操作
    1. 调用remove（）方法，一次删除一个指定元素，如果指定元素不存在则抛出keyError异常；
    2. 调用discard（）方法，一次删除一个指定元素，如果指定的元素不存在不抛出异常；
    3. 调用pop（）方法，一次只删除一个任意元素；
    4. 调用clear（），清空集合；
"""
s = {'Python','hello',98,24,31}
print(s)
s.remove(98)
print(s)
# s.remove(100)  # 移除集合中不存在的元素会抛出异常 KeyError: 100
s.discard(100)
print(s)        # # 如果集合中存在这个元素就直接删除，但是如果集合中没有该元素也不会抛出异常
s.pop()        #  删除任意一个元素   pop（）方法没有参数，带参数会抛出异常
print(s)
s.clear()
print(s)
print('--------------------------------------------')

# 集合之间的关系
# 判断两个集合是否相等  元素相等，集合就相等
s1 = {1,2,3,4,5}
s2 = {1,2,3,4}
print(s1 == s2)
print(s1 != s2)
print(s2.issubset(s1))  # 判断s2是否是s1的子集   True
print(s2.issuperset(s1)) #判断s2是否是s1的超集   False
print(s2.isdisjoint(s1))  # 判断两个集合是否没有交集   False就是有交集
print('--------------------------------------------')

s1 = {10,20,30,40,50}
s2 = {10,30,50,70}
print("s1",s1)
print("s2",s2)
# 交集操作
print("交集",s1.intersection(s2))   # 等价 print(s1 & s2)
print(s1 & s2)
# 并集操作
print(s1.union(s2))    # 等价于   print(s1 | s2)
print(s1 | s2)
# 差集操作
print(s1.difference(s2))   # 等价于 print(s1-s2)   从s1中减去s2的元素
print(s1-s2)
# 对称差集
print(s1.symmetric_difference(s2))  # 相当于  s1和s2的并集减去交集
"""
集合生成式   {item for item in range(1,10)}
列表生成式   [item for item in range(1,10)]    将{}换成[]就是列表生成式
字典生成式： {item:price for item,price in zip(items,prices)}
没有元组生成式
"""
print({item for item in range(1,10)})